// 用户信息
// by indraw 2013.01.01
package bbs

import (
    //"fmt"
    "strconv"
    "strings"
    //"utils/mgo"
    "utils/mgo/bson"
    "utils/util"
    "regexp"
	"encoding/hex"

)

//用户类型
type User struct{
    Dao
    UserData
}

//定义用户信息
type UserData struct {
    //
    Userid bson.ObjectId "_id"
    Passwd string         //登录密码
    Username string         //用户姓名
    Email    string         //用户邮箱
    Alias string            //自定义昵称
    Location string         //来源地址
    Groupid int             //所属群组
    Tempgid int             //附属群组
    Tempexpiry int          //附属群组时间
    Photo string            //用户头像
    Phototype string        //类型
    Photospace string       //空间图片
    Firstip string          //第一次登陆ip
    Firsttime int           //第一次登陆时间
    Lastip string           //最后登录ip
    Lasttime int            //最后登录时间
    Lastpost string         //最后发表信息
    Topics int              //发布主题数
    Posts int               //发布帖子数
    Hourposts int           //今天发表
    Deletes int             //被删除数量
    Piths int               //被加精数量
    Pageviews int           //浏览的页面数
    Oltime int              //在线时长
    Loginnum int            //登录次数
    Cbcredit int            //贡献数
    Credit int              //积分数
    Sigstate int            //签名状态
    Sight string            //签名
    Styleid int             //模板id
    Honor string            //荣誉列表
    Status int              //状态
    
    //
    //id string
    //createtime string
    
}

/**
 * 初始化对象
 *
 * author: indraw
 * date: 2013-02-11
 */
func newUser() *User {

    u := &User{
        Dao{
            c:db.C("user"),
        },
        UserData{
            Userid:bson.NewObjectId(),
            Passwd:"",         //登录密码
            Username:"",         //用户姓名
            Email:"",         //用户邮箱
            Alias:"",            //自定义昵称
            Location:"",         //来源地址
            Groupid:11,             //所属群组
            Tempgid:0,             //附属群组
            Tempexpiry:0,          //附属群组时间
            Photo:"000.jpg",            //用户头像
            Phototype:"",        //类型
            Photospace:"",       //空间图片
            Firstip:"",          //第一次登陆ip
            Lastip:"",           //最后登录ip
            Lasttime:0,            //最后登录时间
            Lastpost:"",         //最后发表信息
            Topics:0,              //发布主题数
            Posts:0,               //发布帖子数
            Hourposts:0,           //今天发表
            Deletes:0,             //被删除数量
            Piths:0,               //被加精数量
            Pageviews:0,           //浏览的页面数
            Oltime:0,              //在线时长
            Loginnum:0,            //登录次数
            Cbcredit:0,            //贡献数
            Credit:0,              //积分数
            Sigstate:0,            //签名状态
            Sight:"这家伙很懒，什么也没有留下",            //签名
            Styleid:0,             //模板id
            Honor:"",            //荣誉列表
            Status:1,              //状态
        },
    }
    return u
}

/**
 * 设置用户ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setUserid( userid string ) {
    
    if m, _ := regexp.MatchString("^[a-zA-Z0-9]+$", userid); !m {
        u.newError("请填写userid")
        return
    }
    u.Userid = bson.ObjectIdHex(userid)
}

/**
 * 设置用户ID
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) getUserid() ( userid string ) {
    
    return hex.EncodeToString([]byte(u.Userid))
}

/**
 * 设置用户Name
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setUsername( username string ) {
    
    username = strings.TrimSpace(username)
    if m := util.CheckLen(username,3); !m {
        u.newError("请填写用户名" + username)
        return
    }
    u.Username = username

}

/**
 * 设置用户Email
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setEmail( email string ) {
    
    if m := util.CheckEmail(email); !m {
        u.newError("请填写用户邮箱" + email)
        return
    }
    u.Email = email
}

/**
 * 设置用户密码
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setPasswd( passwd string ) {

    passwd = strings.TrimSpace(passwd)

    if m := util.CheckLen(passwd,6); !m {
        u.newError("请填写登录密码" + passwd)
        return
    }
    u.Passwd = passwd
}

/**
 * 设置用户别名
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setAlias( alias string ) {

    alias = strings.TrimSpace(alias)

    if m := util.CheckLenMax(alias,30); !m {
        u.newError("别名不可以超过30个字符" + alias)
        return
    }
    u.Alias = alias
}


/**
 * 设置用户来源
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setLocation( location string ) {

    location = strings.TrimSpace(location)

    if m := util.CheckLenMax(location,30); !m {
        u.newError("来源不可以超过30个字符" + location)
        return
    }
    u.Location = location
}

/**
 * 设置用户头像
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setPhoto( photo string ) {

    photo = strings.TrimSpace(photo)

    u.Photo = photo
}

/**
 * 设置用户是否签名
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setSigstate( sigstate string ) {

    s,_ := strconv.Atoi(sigstate)

    u.Sigstate = s
}


/**
 * 设置用户来源
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) setSight( sight string ) {

    sight = strings.TrimSpace(sight)

    if m := util.CheckLenMax(sight,300); !m {
        u.newError("签名不可以超过100个字符" + sight)
        return
    }
    u.Sight = sight
}


/**
 * 写入数据库
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) add() error {
    
    //判断错误
    if err := u.ckError(); err != nil {
        return err
    }
    //判断是否重复
    var c User
    u.c.Find(bson.M{"username": u.Username}).One(&c.UserData) 
    if c.Username == u.Username{
        return u.newError("用户名重复[" + u.Username + "]")
    }
    u.c.Find(bson.M{"email": u.Email}).One(&u) 
    
    //如果没重复，写入
    if c.Email == u.Email{
        return u.newError("用户邮箱重复[" + u.Email + "]")
    }
    //执行写入
    if  err := u.c.Insert(&u.UserData); err != nil {
        return err
    }
    
    return nil
}

/**
 * 获取一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) get() error {
    //判断错误
    if err := u.ckError(); err != nil {
        return err
    }

    //执行
    if  err := u.c.Find(bson.M{"_id": u.Userid}).One(&u.UserData); err != nil {
        return err
    }
    return nil
}

/**
 * 获取一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) getByEmail() error {
    //fmt.Println("user.go")
    //判断错误
    if err := u.ckError(); err != nil {
        return err
    }

    //执行
    if  err := u.c.Find(bson.M{"email": u.Email}).One(&u.UserData); err != nil {
        return err
    }
    return nil
}

/**
 * 分页获取记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) list(page *util.PageMaker) []UserData {
    //fmt.Println("user.go")
    //判断是否重复
    var l []UserData
    u.c.Find(nil).Sort("-_id").Skip(page.Begin).Limit(page.PerPage).All(&l)
    
    return l
    
}

/**
 * 删除一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) count() int {
    //fmt.Println("user.go")
    var n int
    n,err := u.c.Find(nil).Count()
    if err != nil{
        n = 0
    }
    
    return n
}

/**
 * 获取前多少条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) top() error {
    //fmt.Println("user.go")
    
    return nil
}

/**
 * 更新一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) update() error {
    //fmt.Println("user.go")
    
    return nil
}

/**
 * 更新信息
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) updateInfo() error {
    //fmt.Println("user.go")
    //判断错误
    if err := u.ckError(); err != nil {
        return err
    }
    
    u.c.Update(bson.M{"_id": u.Userid}, bson.M{"$set": bson.M{"alias":u.Alias,"location":u.Location,"photo":u.Photo,"sigstate":u.Sigstate,"sight":u.Sight}})

    return nil
}

/**
 * 更新最后登录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) updateLogin() error {
    //fmt.Println("user.go")

    u.c.Update(bson.M{"_id": u.Userid}, bson.M{"$inc": bson.M{"loginnum": 1},"$set": bson.M{"lastip":u.Lastip,"lasttime":util.GetUnixTime()}})

    return nil
}


/**
 * 更新最后登录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) updatePost(ispost int) error {
    //fmt.Println("user.go")
    if ispost == 0{
        u.c.Update(bson.M{"_id": u.Userid}, bson.M{"$inc": bson.M{"topics": 1},"$set": bson.M{"lastpost":u.Lastpost}})
    }else{
        u.c.Update(bson.M{"_id": u.Userid}, bson.M{"$inc": bson.M{"topics": 1,"posts": 1},"$set": bson.M{"lastpost":u.Lastpost}})
    }
    return nil
}

/**
 * 删除一条记录
 *
 * author: indraw
 * date: 2013-02-11
 */
func (u *User) delete() error {
    //fmt.Println("user.go")
    
    return nil
}
